# -*-coding: Utf-8 -*-
# @File : models .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time：2023/6/12

'''
用于存放各个类
'''

from db import db_hander


# 封装父类方法 ---- 关于数据的查看与保存
class DB_BASE(object):
    # 查看用户数据
    # classmethod 将类作为第一个参数传递给方法，通常这个参数被命名为 cls。
    # 这个 cls 参数可以让我们在方法内部调用或修改和类相关的属性，而不需要实例化这个类。
    @classmethod
    def select(cls, username):  # (类,username)
        '''

        :param username:
        :return: obj : 对象（存在）或者None（不存在）
        '''
        # 查找文件需要类的名字和用户名
        obj = db_hander.select_data(cls, username)
        return obj

    # 保存用户数据
    def save(self):
        # 调用数据处理层进行保存用户数据
        db_hander.save_data(self)


# 学校类
class School(DB_BASE):
    '''
    继承父类方法 --- 数据的查看与保存
    '''

    def __init__(self, school_name, school_address):
        # self.user,因为db_hander里面的select_data 格式必须统一
        self.username = school_name
        self.school_address = school_address
        self.courses_list = []


# 学员类
class Student(DB_BASE):

    def __init__(self, username_student, encrypted_password_after, salt):
        self.username = username_student
        self.password = encrypted_password_after
        self.salt = salt
        # 每个学生只能有一个校区
        self.school_name = None
        # 但是每个学生可以选择多门课程
        self.course_lists = []
        # 学生的课程分数
        self.score_dict = {}  # {'course_name': 99}
        # 学生是否缴费
        self.payed_dict = {}  # {'course_name1': False,'course_name2': True}

    # 学生选择学校，添加学校方法
    def choose_school(self, school_name):
        self.school_name = school_name
        # 对学生信息更改以后，对学生信息进行更新保存
        self.save()

    # 学生选择课程，添加课程方法
    def choose_course(self, course_name):
        # 向学生课程列表添加课程
        self.course_lists.append(course_name)
        # 记录当前课程状态
        self.payed_dict[course_name] = False
        # 对学生信息更改以后，对学生信息进行更新保存
        self.save()

    # 学生付费课程，将课程添加到课程列表
    def payed_course(self, course_name):
        # 获取课程对象
        course_obj = Courses.select(course_name)
        # 向班级列表内添加学生名字
        course_obj.students.append(self.username)
        # 设置课程默认分数为 0
        self.score_dict[course_name] = 0
        # 更改学生课表内的课程状态为真
        self.payed_dict[course_name] = True
        # 保存课程数据
        self.save()
        course_obj.save()


# 课程类
class Courses(DB_BASE):
    def __init__(self, course_name, course_timestamp, course_price):
        self.username = course_name
        self.course_timestamp = course_timestamp
        self.course_price = course_price
        self.students = []


# 讲师类
class Teacher(DB_BASE):
    # 初始化类变量
    def __init__(self, teacher_name, teacher_password, teacher_salt):
        self.username = teacher_name
        self.password = teacher_password
        self.salt = teacher_salt
        # 讲授的课程列表
        self.course_list_from_teacher = []

    # 查看全部课程
    def show_course_list(self):
        return self.course_list_from_teacher

    # 添加课程
    def add_course(self, course_name):
        # 将课程名字添加到列表内
        self.course_list_from_teacher.append(course_name)
        # 保存数据
        self.save()

    # 获取对应课程的学生列表
    def get_student_list(self, course_name):
        course_obj = Courses.select(course_name)

        return course_obj.students

    def change_student_score(self, course_name, student_name, score_student):
        # （1） 获取学生对象
        student_obj = Student.select(student_name)

        # （2）对学生对象中的学生课程分数进行修改
        student_obj.score_dict[course_name] = score_student

        # (3) 保存数据
        student_obj.save()


# 管理员类
class Admin(DB_BASE):
    '''
    1.注册
    2.登陆
    3.创建学校
    4.创建课程（先选择学校）
    5.创建讲师
    '''

    # 初始化类
    def __init__(self, username, password, salt):
        # 更新初始化变量
        self.username = username
        self.password = password
        self.salt = salt

    # 创建学校功能
    # 创建学校
    def create_school(self, school_name, school_address):
        # 实例化类对象，调用类对象执行相关的方法
        school_obj = School(school_name, school_address)
        # 调用数据保存方法进行数据保存
        school_obj.save()

    # 创建课程功能
    def create_course(self, school_obj, course_name, course_timestamp, course_price):
        # 1. 调用课程类，实例化创建课程
        course_obj = Courses(course_name, course_timestamp, course_price)
        course_obj.save()
        # 2.获取当前学校对象，并添加课程到课程类表内
        school_obj.courses_list.append(course_name)
        # 3.更新学校数据
        school_obj.save()

    # 创建讲师
    def create_teacher(self, teacher_name, teacher_password, teacher_salt):
        # 1. 调用老师类实例化老师对象，并保存
        teacher_obj = Teacher(teacher_name, teacher_password, teacher_salt)
        teacher_obj.save()
